package Listas;

import Persistencia.ArrendatarioSqlHelper;
import Utils.ConBd;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.swing.JOptionPane;

/*
 *@author OSCAR MESA
 *@version 1.2z Build Poli  18 de mayo de 2012
 * 
 *ACTUALIZADO POR
 *
 *POLITECNICO COLOMBIANO JAIME ISAZA CADAVID
 *Esta clase permite generar la lista.
 *	+ cabeza de la lista
 *
 */
public class LSL_Arrendatario {

    private Nodo_Arrendatario cabeza;

    /*
     * Este es el constructructor de la clase, el cual permite inicializar la cabeza de la lista en null.
     * 
     * @return                  no retorna.
     */
    public LSL_Arrendatario() {
        this.cabeza = null;
    }

    /*
     * Este metodo permite realizar la insercion ordenada en la lista, asignando los respectivos atributos.
     * 
     * @param codigo             se le asigna el codigo enviado, al codigo del articulo que se esta creando
     * @param nombre             se le asigna el nombre enviado, al nombre del articulo que se esta creando
     * @param costo              se le asigna el costo enviado, al costo del articulo que se esta creando
     * @param valor              se le asigna el valor enviado, al valor del articulo que se esta creando
     * @return                  no retorna.
     */
    public void InsertarOrdenado(String NroDocumento, String Nombre, String Apellido, String Email, String TelefonoFijo, String TelefonoCelular, String Profesion, String NroHijos) {
        Nodo_Arrendatario N = new Nodo_Arrendatario(NroDocumento, Nombre, Apellido, Email, TelefonoFijo, TelefonoCelular, Profesion, NroHijos), A;
        if (cabeza == null) {
            cabeza = N;
        } else {
            A = BuscarAnterior(NroDocumento);
            if (A == null) {
                N.setLiga(cabeza);
                this.cabeza = N;
            } else {
                N.setLiga(A.getLiga());
                A.setLiga(N);
            }
        }
    }

    public void CargarListaConLaBasedeDatos(String NroDocumento, String Nombre, String Apellido, String Email, String TelefonoFijo, String TelefonoCelular, String Profesion, String NroHijos) {
        Nodo_Arrendatario N = new Nodo_Arrendatario(NroDocumento, Nombre, Apellido, Email, TelefonoFijo, TelefonoCelular, Profesion, NroHijos), A;
        if (cabeza == null) {
            cabeza = N;
        } else {
            A = BuscarUltimoNodo();
            N.setLiga(null);
            A.setLiga(N);

        }
    }

    public Nodo_Arrendatario BuscarUltimoNodo() {
        Nodo_Arrendatario P = cabeza;

        while (P.getLiga() != null) {
            P = P.getLiga();
        }
        return P;
    }


    /*
     * Este metodo permite realizar una busqueda en la lista por codigo.
     * 
     * @param codigo             Es el codigo que se desea buscar en la lista
     * 
     * @return                  Retorna el Nodo o articulo que se desea buscar, en caso de no encontrarce, se retorna null.
     */
    public Nodo_Arrendatario Buscar(String NroDocumento) {
        Nodo_Arrendatario P = cabeza;
        while (P != null) {

            if ((NroDocumento.equals(P.getNroDocumento()))) {
                return P;
            } else {
                P = P.getLiga();
            }
        }
        return P;
    }

    /*
     * Este metodo permite eliminar un Nodo o articulo de la lista.
     * 
     * @param codigo             Es el codigo que se desea buscar y eliminar
     * 
     * @return                  Retorna una valor logicico (boolean). True si el elmento fue elimnado, de otro modo retorna False.
     */
    public boolean Eliminar(String NroDocumento) {
        Nodo_Arrendatario Q, T = null;
        boolean bandera = true;
        Q = cabeza;
        while (!(NroDocumento.equals(Q.getNroDocumento())) && bandera) {
            if (Q.getLiga() != null) {
                T = Q;
                Q = Q.getLiga();
            } else {
                bandera = false;
            }
        }

        if (!bandera) {
            return false;
        } else if (cabeza == Q) {
            cabeza = Q.getLiga();
        } else {
            T.setLiga(Q.getLiga());
        }
        Q = null;
        System.gc();//Metodo garbage collector
        return true;
    }

    /*
     * Este metodo permite modificar un Nodo especifico en la lista.
     * 
     * @param Nodo               este parametro es de tipo Nodo. Representa el articulo al cual se le desea realizar la modificaciÃ³n.
     * @param nombre             se le asigna el nombre enviado, al nombre del articulo que se desea modificar.
     * @param costo              se le asigna el costo enviado, al costo del articulo que se desea modificar.
     * @param valor              se le asigna el valor enviado, al valor del articulo que se desea modificar.
     * 
     * @return                   no retorna.
     */
    public void Modificar(Nodo_Arrendatario N, String Nombre, String Apellido, String Email, String TelefonoFijo, String TelefonoCelular, String Profesion, String NroHijos) {
        N.setNombre(Nombre);
        N.setApellido(Apellido);
        N.setEmail(Email);
        N.setTelefonoFijo(TelefonoFijo);
        N.setTelefonoCelular(TelefonoCelular);
        N.setProfesion(Profesion);
        N.setNroHijos(NroHijos);

    }

    /*
     * Este metodo permite imprimir toda la lista, con cada uno de sus atributos.
     *  
     * @return                   no retorna.
     */
    public void ImprimirLista() {
        Nodo_Arrendatario P = cabeza;

        System.out.println("Lista Simplemente Ligada\n");

        while (P != null) {
            System.out.println("---------------------------");
            System.out.println("Codigo:" + P.getNroDocumento());
            System.out.println("Nombre:" + P.getNombre());
            System.out.println("Costo:" + P.getApellido());
            System.out.println("Valor:" + P.getEmail());
            System.out.println("Valor:" + P.getTelefonoFijo());
            System.out.println("Valor:" + P.getTelefonoCelular());
            System.out.println("Valor:" + P.getProfesion());
            System.out.println("Valor:" + P.getNroHijos());
            P = P.getLiga();
        }
    }

    /*  
     * Este metodo permite permite buscar un Nodo o articulo anterior al que se esta haciendo referencia, este metodo es muy util para buscar o eliminar.
     * 
     * @param codigo               Este parametro especifica el codigo al Nodo que estoy buscando.
     * 
     * @return                   Retorna el Nodo Anterior al que estoy buscando, en caso de no enontarlo retorna Null.
     */
    public Nodo_Arrendatario BuscarAnterior(String NroDocumento) {
        Nodo_Arrendatario A = null, P = cabeza;;

        while (P != null) {
            if (!(NroDocumento.equals(A.getNroDocumento()))) {
                A = P;
                P = P.getLiga();
            } else {
                return A;
            }
        }
        return A;
    }

    /*  
     * Este metodo permite conocer la cabeza de la lista.
     * 
     * 
     * @return                   Retorna el Nodo o articulo que esta de 1ro o es la cabeza.
     */
    public Nodo_Arrendatario getCabeza() {
        return cabeza;
    }

    /*  
     * Este metodo permite asignar el Nodo inicial a cabeza de la lista.
     * 
     * 
     * @return                   No retorna.
     */
    public void setCabeza(Nodo_Arrendatario cabeza) {
        this.cabeza = cabeza;
    }

    public int CargarBd() {
        Nodo_Arrendatario Nodo = cabeza;
        Connection c;
        c = ConBd.getConexionMysql();
        int resultadoCrear = 0;
        try {
            c.prepareStatement("DELETE FROM arrendatario WHERE 1").executeQuery();
            System.out.printf("Esta mierda duniona");
        } catch (SQLException e) {
            System.out.printf("Esta mierda no funciona");
        }

        String sql = ArrendatarioSqlHelper.crear();

        while (Nodo != null) {
            try {
                PreparedStatement st = c.prepareStatement(sql);

                st.setString(1, Nodo.getNroDocumento());
                st.setString(2, Nodo.getNombre());
                st.setString(3, Nodo.getApellido());
                st.setString(4, Nodo.getEmail());
                st.setString(5, Nodo.getTelefonoFijo());
                st.setString(6, Nodo.getTelefonoCelular());
                st.setString(7, Nodo.getProfesion());
                st.setString(8, Nodo.getNroHijos());

                resultadoCrear = st.executeUpdate();

            } catch (SQLException ex) {

            }
            Nodo = Nodo.getLiga();

        }
        return resultadoCrear;
    }

}
